package Servicios;

import DAO.EstacionTrabajoDAO;
import DAO.SalaDAO;
import DAO.UsuarioDAO;
import Entidad.EstacionTrabajo;
import Entidad.ReservaEstacion;
import Entidad.Usuario;
import Singletons.Mensajes;
import VO.EstacionTrabajoVO;
import VO.ReservaEstacionVO;
import java.util.ArrayList;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;

public class ServicioEstacionTrabajo {

    /**
     * <p> busca una estacio de trabajo con el id dado </p>
     * @param id
     * @param em
     * @return objeto con la informacion de la estaion de trabajo
     */
    public EstacionTrabajoVO leerEstacionTrabajo(Long id, EntityManager em) {
        EstacionTrabajoDAO etdao = new EstacionTrabajoDAO();
        EstacionTrabajo et = etdao.Buscar(id,em);
        if(et!=null){
            EstacionTrabajoVO etvo = new EstacionTrabajoVO();
            etvo.setCapacidad(et.getCapacidad());
            etvo.setDescripcion(et.getDescripcion());
            etvo.setDisponibilidad(et.getDisponibilidad());
            etvo.setId(et.getId());
            etvo.setNumero(et.getNumero());
            etvo.setPc(et.isPc());
            etvo.setSala(et.getSala().getNombre());
            etvo.setToma(et.isToma());
            etvo.setX(et.getX());
            etvo.setY(et.getY());
            return etvo;
        }
        else{
            return null;
        }
    }

    /**
     * <p> Busca todas las estaciones de trabajo asociadas a la sala del id recibido</p>
     * @param idSala
     * @param em
     * @return Lista de estaciones de trabajo
     */
    public ArrayList<EstacionTrabajoVO> listaEstacionesTrabajoPorSala(Long idSala, EntityManager em) {
        EstacionTrabajoDAO dao = new EstacionTrabajoDAO();
        ArrayList<EstacionTrabajo> listaEstaciones = dao.listaPorSala(idSala,em);
        ArrayList<EstacionTrabajoVO> listaEstacionesVO = new ArrayList<EstacionTrabajoVO>();
        EstacionTrabajoVO etvo = null;

        if (!listaEstaciones.isEmpty())
            for (EstacionTrabajo et: listaEstaciones){
                etvo = new EstacionTrabajoVO();
                etvo.setCapacidad(et.getCapacidad());
                etvo.setDescripcion(et.getDescripcion());
                etvo.setDisponibilidad(et.getDisponibilidad());
                etvo.setId(et.getId());
                etvo.setNumero(et.getNumero());
                etvo.setPc(et.isPc());
                etvo.setSala(et.getSala().getNombre());
                etvo.setToma(et.isToma());
                etvo.setX(et.getX());
                etvo.setY(et.getY());
                listaEstacionesVO.add(etvo);
            }
            return listaEstacionesVO;
    }

    /**
     * <p> verifica que exista un usuario con el correo especificado, si es asi crea una
     * reserva con la hora de reserva nula y la hora de prestamo inicializada con la hora actual</p>
     * @param correo
     * @param idEstacion
     * @return String del resultado de tratar de realizar la reserva
     */
    public ReservaEstacionVO prestarEstacion(String correo, long idEstacion,EntityManager em) {
        UsuarioDAO usuarioDAO = new UsuarioDAO();
        Usuario u=null;
        try{
            u = usuarioDAO.encontrarUsuarioPorCorreo(correo, em);
        }catch(PersistenceException e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
        if(u!=null){
            ServicioReservaEstacion cre = new ServicioReservaEstacion();
            Date fecha = new Date();
            ReservaEstacion Reserva = cre.hacerReservacion(u, idEstacion, fecha, null, ServicioReservaEstacion.horaActual(0)+"---:--",em);
            if(Reserva!=null){
                ReservaEstacionVO revo = new ReservaEstacionVO();
                revo.setEstado(Mensajes.OCUPADA);
                revo.setHorarioPrestamo(Reserva.getHorarioPrestamo());
                revo.setEstacion(Reserva.getEstacion().getId());
                revo.setUsuario(u.getNombre());
                return revo;
            }
            else{
                return null;
            }
        }
        else{
            return null;
        }
    }


    public EstacionTrabajoVO actualizarEstacion(EstacionTrabajoVO etvo,EntityManager em) {
        EstacionTrabajoDAO etdao = new EstacionTrabajoDAO();
        EstacionTrabajo et = Vo_a_Entidad(etvo,em);
        try{
            etdao.Actualizar(et, em);
        }catch(PersistenceException e){
            return null;
        }
        return etvo;
    }
    /**
     * <p> convierte un objeto ligero al objeto real como esta en la abse de datos </p>
     * @param etvo
     * @param em
     * @return objeto con toda la informacion de un estacin de trabajo
     */
    private EstacionTrabajo Vo_a_Entidad(EstacionTrabajoVO etvo,EntityManager em) {
        EstacionTrabajo et = new EstacionTrabajo();
        et.setId(etvo.getId());
        et.setCapacidad(etvo.getCapacidad());
        et.setDescripcion(etvo.getDescripcion());
        et.setNumero(etvo.getNumero());
        et.setPc(etvo.isPc());
        et.setDisponibilidad(etvo.isDisponibilidad());
        et.setToma(etvo.isToma());
        SalaDAO sdao = new SalaDAO();
        et.setSala(sdao.buscarPorNombre(etvo.getSala(), em));
        et.setX(etvo.getX());
        et.setY(etvo.getY());
        return et;
    }

}
